Make gtk argument parsing use goption. Add gtk_get_option_group and
authorAnders Carlsson <andersca@gnome.org>
Sun, 5 Sep 2004 15:09:55 +0000 (15:09 +0000)
committerAnders Carlsson <andersca@src.gnome.org>
Sun, 5 Sep 2004 15:09:55 +0000 (15:09 +0000)
2004-09-05  Anders Carlsson  <andersca@gnome.org>

* gdk/gdk.c: (gdk_arg_class_cb), (gdk_arg_name_cb),
(gdk_add_option_entries_libgtk_only), (gdk_pre_parse_libgtk_only),
(gdk_parse_args):
* gdk/gdk.h:
* gdk/gdkinternals.h:
* gdk/linux-fb/gdkmain-fb.c: (_gdk_windowing_init):
* gdk/win32/gdkmain-win32.c: (_gdk_windowing_init):
* gdk/x11/gdkdisplay-x11.c: (gdk_display_open):
* gdk/x11/gdkmain-x11.c: (_gdk_windowing_init):
* gtk/gtkmain.c: (gtk_arg_debug_cb), (gtk_arg_no_debug_cb),
(gtk_arg_module_cb), (gtk_arg_warnings_cb),
(do_pre_parse_initialization), (do_post_parse_initialization),
(pre_parse_hook), (post_parse_hook), (gtk_get_option_group),
(gtk_init_with_args), (gtk_parse_args):
* gtk/gtkmain.h:
Make gtk argument parsing use goption. Add gtk_get_option_group and
gtk_init_with_args.

* tests/testtreemodel.c: (main):
Use gtk_init_with_args.

14 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdk.c
gdk/gdk.h
gdk/gdkinternals.h
gdk/linux-fb/gdkmain-fb.c
gdk/win32/gdkmain-win32.c
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkmain-x11.c
gtk/gtkmain.c
gtk/gtkmain.h
tests/testtreemodel.c

index 2520f15fa42d96755df70886a9b5cf646d391a6a..f780e9c813a5b3fcec5db1e68da91afe9223d808 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2004-09-05  Anders Carlsson  <andersca@gnome.org>
+
+       * gdk/gdk.c: (gdk_arg_class_cb), (gdk_arg_name_cb),
+       (gdk_add_option_entries_libgtk_only), (gdk_pre_parse_libgtk_only),
+       (gdk_parse_args):
+       * gdk/gdk.h:
+       * gdk/gdkinternals.h:
+       * gdk/linux-fb/gdkmain-fb.c: (_gdk_windowing_init):
+       * gdk/win32/gdkmain-win32.c: (_gdk_windowing_init):
+       * gdk/x11/gdkdisplay-x11.c: (gdk_display_open):
+       * gdk/x11/gdkmain-x11.c: (_gdk_windowing_init):
+       * gtk/gtkmain.c: (gtk_arg_debug_cb), (gtk_arg_no_debug_cb),
+       (gtk_arg_module_cb), (gtk_arg_warnings_cb),
+       (do_pre_parse_initialization), (do_post_parse_initialization),
+       (pre_parse_hook), (post_parse_hook), (gtk_get_option_group),
+       (gtk_init_with_args), (gtk_parse_args):
+       * gtk/gtkmain.h:
+       Make gtk argument parsing use goption. Add gtk_get_option_group and
+       gtk_init_with_args. 
+       
+       * tests/testtreemodel.c: (main):
+       Use gtk_init_with_args.
+       
 Sun Sep  5 01:04:01 2004  Matthias Clasen  <maclas@gmx.de>
 
        Allow sorting of tree models to be turned off 
index 2520f15fa42d96755df70886a9b5cf646d391a6a..f780e9c813a5b3fcec5db1e68da91afe9223d808 100644 (file)
@@ -1,3 +1,26 @@
+2004-09-05  Anders Carlsson  <andersca@gnome.org>
+
+       * gdk/gdk.c: (gdk_arg_class_cb), (gdk_arg_name_cb),
+       (gdk_add_option_entries_libgtk_only), (gdk_pre_parse_libgtk_only),
+       (gdk_parse_args):
+       * gdk/gdk.h:
+       * gdk/gdkinternals.h:
+       * gdk/linux-fb/gdkmain-fb.c: (_gdk_windowing_init):
+       * gdk/win32/gdkmain-win32.c: (_gdk_windowing_init):
+       * gdk/x11/gdkdisplay-x11.c: (gdk_display_open):
+       * gdk/x11/gdkmain-x11.c: (_gdk_windowing_init):
+       * gtk/gtkmain.c: (gtk_arg_debug_cb), (gtk_arg_no_debug_cb),
+       (gtk_arg_module_cb), (gtk_arg_warnings_cb),
+       (do_pre_parse_initialization), (do_post_parse_initialization),
+       (pre_parse_hook), (post_parse_hook), (gtk_get_option_group),
+       (gtk_init_with_args), (gtk_parse_args):
+       * gtk/gtkmain.h:
+       Make gtk argument parsing use goption. Add gtk_get_option_group and
+       gtk_init_with_args. 
+       
+       * tests/testtreemodel.c: (main):
+       Use gtk_init_with_args.
+       
 Sun Sep  5 01:04:01 2004  Matthias Clasen  <maclas@gmx.de>
 
        Allow sorting of tree models to be turned off 
index 2520f15fa42d96755df70886a9b5cf646d391a6a..f780e9c813a5b3fcec5db1e68da91afe9223d808 100644 (file)
@@ -1,3 +1,26 @@
+2004-09-05  Anders Carlsson  <andersca@gnome.org>
+
+       * gdk/gdk.c: (gdk_arg_class_cb), (gdk_arg_name_cb),
+       (gdk_add_option_entries_libgtk_only), (gdk_pre_parse_libgtk_only),
+       (gdk_parse_args):
+       * gdk/gdk.h:
+       * gdk/gdkinternals.h:
+       * gdk/linux-fb/gdkmain-fb.c: (_gdk_windowing_init):
+       * gdk/win32/gdkmain-win32.c: (_gdk_windowing_init):
+       * gdk/x11/gdkdisplay-x11.c: (gdk_display_open):
+       * gdk/x11/gdkmain-x11.c: (_gdk_windowing_init):
+       * gtk/gtkmain.c: (gtk_arg_debug_cb), (gtk_arg_no_debug_cb),
+       (gtk_arg_module_cb), (gtk_arg_warnings_cb),
+       (do_pre_parse_initialization), (do_post_parse_initialization),
+       (pre_parse_hook), (post_parse_hook), (gtk_get_option_group),
+       (gtk_init_with_args), (gtk_parse_args):
+       * gtk/gtkmain.h:
+       Make gtk argument parsing use goption. Add gtk_get_option_group and
+       gtk_init_with_args. 
+       
+       * tests/testtreemodel.c: (main):
+       Use gtk_init_with_args.
+       
 Sun Sep  5 01:04:01 2004  Matthias Clasen  <maclas@gmx.de>
 
        Allow sorting of tree models to be turned off 
index 2520f15fa42d96755df70886a9b5cf646d391a6a..f780e9c813a5b3fcec5db1e68da91afe9223d808 100644 (file)
@@ -1,3 +1,26 @@
+2004-09-05  Anders Carlsson  <andersca@gnome.org>
+
+       * gdk/gdk.c: (gdk_arg_class_cb), (gdk_arg_name_cb),
+       (gdk_add_option_entries_libgtk_only), (gdk_pre_parse_libgtk_only),
+       (gdk_parse_args):
+       * gdk/gdk.h:
+       * gdk/gdkinternals.h:
+       * gdk/linux-fb/gdkmain-fb.c: (_gdk_windowing_init):
+       * gdk/win32/gdkmain-win32.c: (_gdk_windowing_init):
+       * gdk/x11/gdkdisplay-x11.c: (gdk_display_open):
+       * gdk/x11/gdkmain-x11.c: (_gdk_windowing_init):
+       * gtk/gtkmain.c: (gtk_arg_debug_cb), (gtk_arg_no_debug_cb),
+       (gtk_arg_module_cb), (gtk_arg_warnings_cb),
+       (do_pre_parse_initialization), (do_post_parse_initialization),
+       (pre_parse_hook), (post_parse_hook), (gtk_get_option_group),
+       (gtk_init_with_args), (gtk_parse_args):
+       * gtk/gtkmain.h:
+       Make gtk argument parsing use goption. Add gtk_get_option_group and
+       gtk_init_with_args. 
+       
+       * tests/testtreemodel.c: (main):
+       Use gtk_init_with_args.
+       
 Sun Sep  5 01:04:01 2004  Matthias Clasen  <maclas@gmx.de>
 
        Allow sorting of tree models to be turned off 
index 8226564f31a74ab7c5d1e661d15dddb6d8ee525d..47c8029ff795a35d8cb15c8f6a5c22c94d2acc93 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -77,135 +77,6 @@ static const int gdk_ndebug_keys = G_N_ELEMENTS (gdk_debug_keys);
 
 #endif /* G_ENABLE_DEBUG */
 
-static GdkArgContext *
-gdk_arg_context_new (gpointer cb_data)
-{
-  GdkArgContext *result = g_new (GdkArgContext, 1);
-  result->tables = g_ptr_array_new ();
-  result->cb_data = cb_data;
-
-  return result;
-}
-
-static void
-gdk_arg_context_destroy (GdkArgContext *context)
-{
-  g_ptr_array_free (context->tables, TRUE);
-  g_free (context);
-}
-
-static void
-gdk_arg_context_add_table (GdkArgContext *context, GdkArgDesc *table)
-{
-  g_ptr_array_add (context->tables, table);
-}
-
-static void
-gdk_arg_context_parse (GdkArgContext *context, gint *argc, gchar ***argv)
-{
-  int i, j, k;
-
-  if (argc && argv)
-    {
-      for (i = 1; i < *argc; i++)
-       {
-         char *arg;
-         
-         if (!((*argv)[i][0] == '-' && (*argv)[i][1] == '-'))
-           continue;
-         
-         arg = (*argv)[i] + 2;
-
-         /* '--' terminates list of arguments */
-         if (*arg == 0)
-           {
-             (*argv)[i] = NULL;
-             break;
-           }
-             
-         for (j = 0; j < context->tables->len; j++)
-           {
-             GdkArgDesc *table = context->tables->pdata[j];
-             for (k = 0; table[k].name; k++)
-               {
-                 switch (table[k].type)
-                   {
-                   case GDK_ARG_STRING:
-                   case GDK_ARG_CALLBACK:
-                   case GDK_ARG_INT:
-                     {
-                       int len = strlen (table[k].name);
-                       
-                       if (strncmp (arg, table[k].name, len) == 0 &&
-                           (arg[len] == '=' || arg[len] == 0))
-                         {
-                           char *value = NULL;
-
-                           (*argv)[i] = NULL;
-
-                           if (arg[len] == '=')
-                             value = arg + len + 1;
-                           else if (i < *argc - 1)
-                             {
-                               value = (*argv)[i + 1];
-                               (*argv)[i+1] = NULL;
-                               i++;
-                             }
-                           else
-                             value = "";
-
-                           switch (table[k].type)
-                             {
-                             case GDK_ARG_STRING:
-                               *(gchar **)table[k].location = g_strdup (value);
-                               break;
-                             case GDK_ARG_INT:
-                               *(gint *)table[k].location = atoi (value);
-                               break;
-                             case GDK_ARG_CALLBACK:
-                               (*table[k].callback)(table[k].name, value, context->cb_data);
-                               break;
-                             default:
-                               ;
-                             }
-
-                           goto next_arg;
-                         }
-                       break;
-                     }
-                   case GDK_ARG_BOOL:
-                   case GDK_ARG_NOBOOL:
-                     if (strcmp (arg, table[k].name) == 0)
-                       {
-                         (*argv)[i] = NULL;
-                         
-                         *(gboolean *)table[k].location = (table[k].type == GDK_ARG_BOOL) ? TRUE : FALSE;
-                         goto next_arg;
-                       }
-                   }
-               }
-           }
-       next_arg:
-         ;
-       }
-         
-      for (i = 1; i < *argc; i++)
-       {
-         for (k = i; k < *argc; k++)
-           if ((*argv)[k] != NULL)
-             break;
-         
-         if (k > i)
-           {
-             k -= i;
-             for (j = i + k; j < *argc; j++)
-               (*argv)[j-k] = (*argv)[j];
-             *argc -= k;
-           }
-       }
-    }
-}
-
 #ifdef G_ENABLE_DEBUG
 static void
 gdk_arg_debug_cb (const char *key, const char *value, gpointer user_data)
@@ -224,49 +95,78 @@ gdk_arg_no_debug_cb (const char *key, const char *value, gpointer user_data)
 }
 #endif /* G_ENABLE_DEBUG */
 
-static void
-gdk_arg_class_cb (const char *key, const char *value, gpointer user_data)
+static gboolean
+gdk_arg_class_cb (const char *key, const char *value, gpointer user_data, GError **error)
 {
   gdk_set_program_class (value);
+
+  return TRUE;
 }
 
-static void
-gdk_arg_name_cb (const char *key, const char *value, gpointer user_data)
+static gboolean
+gdk_arg_name_cb (const char *key, const char *value, gpointer user_data, GError **error)
 {
   g_set_prgname (value);
-}
 
-static GdkArgDesc gdk_args[] = {
-  { "class" ,       GDK_ARG_CALLBACK, NULL, gdk_arg_class_cb                   },
-  { "name",         GDK_ARG_CALLBACK, NULL, gdk_arg_name_cb                    },
-  { "display",      GDK_ARG_STRING,   &_gdk_display_name,     (GdkArgFunc)NULL },
-  { "screen",       GDK_ARG_INT,      &_gdk_screen_number,    (GdkArgFunc)NULL },
+  return TRUE;
+}
 
+static GOptionEntry gdk_args[] = {
+  { "class",        0, 0,                     G_OPTION_ARG_CALLBACK, gdk_arg_class_cb,    NULL, NULL },
+  { "name",         0, 0,                     G_OPTION_ARG_CALLBACK, gdk_arg_name_cb,     NULL, NULL },
+  { "display",      0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING,   &_gdk_display_name,  NULL, NULL },
+  { "screen",       0, 0,                     G_OPTION_ARG_INT,      &_gdk_screen_number, NULL, NULL },
 #ifdef G_ENABLE_DEBUG
-  { "gdk-debug",    GDK_ARG_CALLBACK, NULL, gdk_arg_debug_cb    },
-  { "gdk-no-debug", GDK_ARG_CALLBACK, NULL, gdk_arg_no_debug_cb },
+  { "gdk-debug",    0, 0,                    G_OPTION_ARG_CALLBACK, gdk_arg_debug_cb,    NULL, NULL },
+  { "gdk-no-debug", 0, 0,                    G_OPTION_ARG_CALLBACK, gdk_arg_no_debug_cb, NULL, NULL },
 #endif /* G_ENABLE_DEBUG */
   { NULL }
 };
 
-
 /**
- * _gdk_get_command_line_args:
- * @argv: location to store argv pointer
- * @argc: location 
+ * gdk_add_option_entries_libgtk_only:
+ * @group: An option group.
  * 
- * Retrieve the command line arguments passed to gdk_init().
- * The returned argv pointer points to static storage ; no
- * copy is made.
+ * Appends gdk option entries to the passed in option group. This is
+ * not public API and must not be used by applications.
  **/
 void
-_gdk_get_command_line_args (int    *argc,
-                           char ***argv)
+gdk_add_option_entries_libgtk_only (GOptionGroup *group)
 {
-  *argc = gdk_argc;
-  *argv = gdk_argv;
+  g_option_group_add_entries (group, gdk_args);
+  g_option_group_add_entries (group, _gdk_windowing_args);
 }
 
+void
+gdk_pre_parse_libgtk_only (void)
+{
+  gdk_initialized = TRUE;
+
+  /* We set the fallback program class here, rather than lazily in
+   * gdk_get_program_class, since we don't want -name to override it.
+   */
+  gdk_progclass = g_strdup (g_get_prgname ());
+  if (gdk_progclass && gdk_progclass[0])
+    gdk_progclass[0] = g_ascii_toupper (gdk_progclass[0]);
+  
+#ifdef G_ENABLE_DEBUG
+  {
+    gchar *debug_string = getenv("GDK_DEBUG");
+    if (debug_string != NULL)
+      _gdk_debug_flags = g_parse_debug_string (debug_string,
+                                             (GDebugKey *) gdk_debug_keys,
+                                             gdk_ndebug_keys);
+  }
+#endif /* G_ENABLE_DEBUG */
+
+  g_type_init ();
+
+  /* Do any setup particular to the windowing system
+   */
+  _gdk_windowing_init ();  
+}
+
+  
 /**
  * gdk_parse_args:
  * @argc: the number of command line arguments.
@@ -287,70 +187,27 @@ void
 gdk_parse_args (int    *argc,
                char ***argv)
 {
-  GdkArgContext *arg_context;
-  gint i;
+  GOptionContext *option_context;
+  GOptionGroup *option_group;
 
   if (gdk_initialized)
     return;
 
-  gdk_initialized = TRUE;
-
-  /* Save a copy of the original argc and argv */
-  if (argc && argv)
-    {
-      gdk_argc = *argc;
-      
-      gdk_argv = g_malloc ((gdk_argc + 1) * sizeof (char*));
-      for (i = 0; i < gdk_argc; i++)
-       gdk_argv[i] = g_strdup ((*argv)[i]);
-      gdk_argv[gdk_argc] = NULL;
-    }
-
-  if (argc && argv && *argc > 0)
-    {
-      gchar *d;
-      
-      d = strrchr((*argv)[0], G_DIR_SEPARATOR);
-      if (d != NULL)
-       g_set_prgname (d + 1);
-      else
-       g_set_prgname ((*argv)[0]);
-    }
-  else
-    {
-      g_set_prgname ("<unknown>");
-    }
-
-  /* We set the fallback program class here, rather than lazily in
-   * gdk_get_program_class, since we don't want -name to override it.
-   */
-  gdk_progclass = g_strdup (g_get_prgname ());
-  if (gdk_progclass[0])
-    gdk_progclass[0] = g_ascii_toupper (gdk_progclass[0]);
+  gdk_pre_parse_libgtk_only ();
   
-#ifdef G_ENABLE_DEBUG
-  {
-    gchar *debug_string = getenv("GDK_DEBUG");
-    if (debug_string != NULL)
-      _gdk_debug_flags = g_parse_debug_string (debug_string,
-                                             (GDebugKey *) gdk_debug_keys,
-                                             gdk_ndebug_keys);
-  }
-#endif /* G_ENABLE_DEBUG */
+  option_context = g_option_context_new (NULL);
+  g_option_context_set_ignore_unknown_options (option_context, TRUE);
+  g_option_context_set_help_enabled (option_context, FALSE);
+  option_group = g_option_group_new (NULL, NULL, NULL, NULL, NULL);
+  g_option_context_set_main_group (option_context, option_group);
   
-  arg_context = gdk_arg_context_new (NULL);
-  gdk_arg_context_add_table (arg_context, gdk_args);
-  gdk_arg_context_add_table (arg_context, _gdk_windowing_args);
-  gdk_arg_context_parse (arg_context, argc, argv);
-  gdk_arg_context_destroy (arg_context);
+  g_option_group_add_entries (option_group, gdk_args);
+  g_option_group_add_entries (option_group, _gdk_windowing_args);
+
+  g_option_context_parse (option_context, argc, argv, NULL);
+  g_option_context_free (option_context);
   
   GDK_NOTE (MISC, g_message ("progname: \"%s\"", g_get_prgname ()));
-
-  g_type_init ();
-
-  /* Do any setup particular to the windowing system
-   */
-  _gdk_windowing_init (argc, argv);
 }
 
 /** 
index 6fcdbf38560ae2bbcad388ed9850a967e5bbe1a9..462d74940e93971848dee2bdf663f21013ca77c1 100644 (file)
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -67,6 +67,8 @@ void    gdk_init                      (gint           *argc,
                                         gchar        ***argv);
 gboolean  gdk_init_check               (gint           *argc,
                                         gchar        ***argv);
+void gdk_add_option_entries_libgtk_only (GOptionGroup *group);
+void gdk_pre_parse_libgtk_only          (void);
 
 #ifndef GDK_DISABLE_DEPRECATED
 void     gdk_exit                      (gint            error_code);
index f9d3c02798c8664dac5edee758aba6d8575a7c5c..1b3ccb4de21283b7ba5ec69b4e5838b56c18f70e 100644 (file)
@@ -238,9 +238,7 @@ void _gdk_colormap_real_destroy (GdkColormap *colormap);
 
 void _gdk_cursor_destroy (GdkCursor *cursor);
 
-extern GdkArgDesc _gdk_windowing_args[];
-void     _gdk_windowing_init                    (gint       *argc,
-                                                 gchar    ***argv);
+extern GOptionEntry _gdk_windowing_args[];
 void     _gdk_windowing_set_default_display     (GdkDisplay *display);
 
 gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name,
@@ -327,9 +325,6 @@ GType _gdk_pixmap_impl_get_type (void) G_GNUC_CONST;
 void _gdk_image_exit  (void);
 void _gdk_windowing_exit (void);
 
-void _gdk_get_command_line_args (int    *argc,
-                                char ***argv);
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 0c1e09d681fe52e20304e7d089dd409e966630d1..d785e44eb66c423619fc80552736f592d3b3f062 100644 (file)
@@ -65,7 +65,7 @@ static const int gdk_ndebug_keys = sizeof(gdk_debug_keys)/sizeof(GDebugKey);
 
 #endif /* G_ENABLE_DEBUG */
 
-GdkArgDesc _gdk_windowing_args[] = {
+GOptionEntry _gdk_windowing_args[] = {
   { NULL }
 };
 
@@ -883,7 +883,7 @@ gdk_fb_display_destroy (GdkFBDisplay *display)
 }
 
 void
-_gdk_windowing_init (int *argc, char ***argv)
+_gdk_windowing_init (void)
 {
   if (gdk_initialized)
     return;
index b34973d3dd27ca6eafb0444cb756629242e1c071..7f54dda022202e0757dcf965b8d33b55f51262d2 100644 (file)
 
 static gboolean gdk_synchronize = FALSE;
 
-GdkArgDesc _gdk_windowing_args[] = {
-  { "sync",          GDK_ARG_BOOL, &gdk_synchronize, (GdkArgFunc) NULL},
-  { "no-wintab",     GDK_ARG_BOOL, &_gdk_input_ignore_wintab,
-                                                    (GdkArgFunc) NULL},
-  { "ignore-wintab", GDK_ARG_BOOL, &_gdk_input_ignore_wintab,
-                                                    (GdkArgFunc) NULL},
-  { "use-wintab",    GDK_ARG_NOBOOL, &_gdk_input_ignore_wintab,
-                                                    (GdkArgFunc) NULL},
-  { "max-colors",    GDK_ARG_INT,  &_gdk_max_colors,  (GdkArgFunc) NULL},
+GOptionEntry _gdk_windowing_args[] = {
+  { "sync", 0, 0, G_OPTION_ARG_NONE, &_gdk_synchronize, NULL, NULL },
+  { "no-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab, NULL, NULL },
+  { "ignore-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab, NULL, NULL },
+#if 0
+  { "use-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab, NULL, NULL },
+#endif
+  { "max-colors", 0, 0, G_OPTION_ARG_INT, &_gdk_max_colors, NULL, NULL },
   { NULL }
 };
 
@@ -75,8 +74,7 @@ DllMain (HINSTANCE hinstDLL,
 }
 
 void
-_gdk_windowing_init (gint    *argc,
-                     gchar ***argv)
+_gdk_windowing_init (void)
 {
   gchar buf[10];
 
index 5da3426aad4637d1d53bcd73f82ef5dd8348c5b4..54c80ade91a2155f5e67bb0ab3eef95b682237f0 100644 (file)
@@ -130,6 +130,7 @@ gdk_display_x11_class_init (GdkDisplayX11Class * class)
   parent_class = g_type_class_peek_parent (class);
 }
 
+
 /**
  * gdk_display_open:
  * @display_name: the name of the display to open
@@ -148,7 +149,7 @@ gdk_display_open (const gchar *display_name)
   GdkDisplayX11 *display_x11;
   GdkWindowAttr attr;
   gint argc;
-  gchar **argv;
+  gchar *argv[1];
   const char *sm_client_id;
   
   XClassHint *class_hint;
@@ -227,7 +228,13 @@ gdk_display_open (const gchar *display_name)
   class_hint->res_name = g_get_prgname ();
   
   class_hint->res_class = (char *)gdk_get_program_class ();
-  _gdk_get_command_line_args (&argc, &argv);
+
+  /* XmbSetWMProperties sets the RESOURCE_NAME environment variable
+   * from argv[0], so we just synthesize an argument array here.
+   */
+  argc = 1;
+  argv[0] = g_get_prgname ();
+  
   XmbSetWMProperties (display_x11->xdisplay,
                      display_x11->leader_window,
                      NULL, NULL, argv, argc, NULL, NULL,
index 2eeea4afb3df7b5f3bbfd684912c75f45a2848fb..c6e7c8bf921350ef77afba23a0b37f94564668f3 100644 (file)
@@ -86,14 +86,13 @@ static int      gdk_x_io_error               (Display     *display);
 static GSList *gdk_error_traps = NULL;               /* List of error traps */
 static GSList *gdk_error_trap_free_list = NULL;      /* Free list */
 
-GdkArgDesc _gdk_windowing_args[] = {
-  { "sync",        GDK_ARG_BOOL,     &_gdk_synchronize,     (GdkArgFunc)NULL },
+GOptionEntry _gdk_windowing_args[] = {
+  { "sync", 0, 0, G_OPTION_ARG_NONE, &_gdk_synchronize, NULL, NULL },
   { NULL }
 };
 
 void
-_gdk_windowing_init (gint    *argc,
-                     gchar ***argv)
+_gdk_windowing_init (void)
 {
   _gdk_x11_initialize_locale ();
   
index 7ded97644012a6ed8921dfaa6461eb9f8276aa20..d699c96724259f62c611ca9c2a0c6b9e388cb3f9 100644 (file)
@@ -348,35 +348,71 @@ gtk_disable_setlocale (void)
 #undef gtk_init_check
 #endif
 
-/**
- * gtk_parse_args:
- * @argc: a pointer to the number of command line arguments.
- * @argv: a pointer to the array of command line arguments.
- * 
- * Parses command line arguments, and initializes global
- * attributes of GTK+, but does not actually open a connection
- * to a display. (See gdk_display_open(), gdk_get_display_arg_name())
- *
- * Any arguments used by GTK+ or GDK are removed from the array and
- * @argc and @argv are updated accordingly.
- *
- * You shouldn't call this function explicitely if you are using
- * gtk_init(), or gtk_init_check().
- *
- * Return value: %TRUE if initialization succeeded, otherwise %FALSE.
- **/
-gboolean
-gtk_parse_args (int    *argc,
-               char ***argv)
+static GString *gtk_modules_string = NULL;
+
+#ifdef G_ENABLE_DEBUG
+static gboolean
+gtk_arg_debug_cb (const char *key, const char *value, gpointer user_data)
 {
-  GString *gtk_modules_string = NULL;
-  const gchar *env_string;
+  gtk_debug_flags |= g_parse_debug_string (value,
+                                          gtk_debug_keys,
+                                          gtk_ndebug_keys);
 
-  if (gtk_initialized)
-    return TRUE;
+  return TRUE;
+}
 
-  if (!check_setugid ())
-    return FALSE;
+static gboolean
+gtk_arg_no_debug_cb (const char *key, const char *value, gpointer user_data)
+{
+  gtk_debug_flags &= ~g_parse_debug_string (value,
+                                           gtk_debug_keys,
+                                           gtk_ndebug_keys);
+}
+#endif /* G_ENABLE_DEBUG */
+
+static gboolean
+gtk_arg_module_cb (const char *key, const char *value, gpointer user_data)
+{
+  if (value && *value)
+    {
+      if (gtk_modules_string)
+       g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR);
+      else
+       gtk_modules_string = g_string_new (NULL);
+      
+      g_string_append (gtk_modules_string, value);
+    }
+
+  return TRUE;
+}
+
+static gboolean
+gtk_arg_warnings_cb (const char *key, const char *value, gpointer user_data)
+{
+  GLogLevelFlags fatal_mask;
+
+  fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+  fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+  g_log_set_always_fatal (fatal_mask);
+
+  return TRUE;
+}
+
+static GOptionEntry gtk_args[] = {
+  { "gtk-module",       0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_module_cb,   NULL, NULL },
+  { "g-fatal-warnings", 0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_warnings_cb, NULL, NULL },
+#ifdef G_ENABLE_DEBUG
+  { "gtk-debug",        0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_debug_cb,    NULL, NULL },
+  { "gtk-no-debug",     0, 0, G_OPTION_ARG_CALLBACK, gtk_arg_no_debug_cb, NULL, NULL },
+#endif /* G_ENABLE_DEBUG */
+  { NULL }
+};
+
+static void
+do_pre_parse_initialization (int    *argc,
+                            char ***argv)
+{
+  const gchar *env_string;
   
 #if    0
   g_set_error_handler (gtk_error);
@@ -391,7 +427,7 @@ gtk_parse_args (int    *argc,
        g_warning ("Locale not supported by C library.\n\tUsing the fallback 'C' locale.");
     }
 
-  gdk_parse_args (argc, argv);
+  gdk_pre_parse_libgtk_only ();
   gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
   
 #ifdef G_ENABLE_DEBUG
@@ -408,109 +444,13 @@ gtk_parse_args (int    *argc,
   env_string = g_getenv ("GTK_MODULES");
   if (env_string)
     gtk_modules_string = g_string_new (env_string);
+}
 
-  if (argc && argv)
-    {
-      gint i, j, k;
-      
-      for (i = 1; i < *argc;)
-       {
-         if (strcmp ("--gtk-module", (*argv)[i]) == 0 ||
-             strncmp ("--gtk-module=", (*argv)[i], 13) == 0)
-           {
-             gchar *module_name = (*argv)[i] + 12;
-             
-             if (*module_name == '=')
-               module_name++;
-             else if (i + 1 < *argc)
-               {
-                 (*argv)[i] = NULL;
-                 i += 1;
-                 module_name = (*argv)[i];
-               }
-             (*argv)[i] = NULL;
-
-             if (module_name && *module_name)
-               {
-                 if (gtk_modules_string)
-                   g_string_append_c (gtk_modules_string, G_SEARCHPATH_SEPARATOR);
-                 else
-                   gtk_modules_string = g_string_new (NULL);
-
-                 g_string_append (gtk_modules_string, module_name);
-               }
-           }
-         else if (strcmp ("--g-fatal-warnings", (*argv)[i]) == 0)
-           {
-             GLogLevelFlags fatal_mask;
-             
-             fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
-             fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
-              g_log_set_always_fatal (fatal_mask);
-             (*argv)[i] = NULL;
-           }
-#ifdef G_ENABLE_DEBUG
-         else if ((strcmp ("--gtk-debug", (*argv)[i]) == 0) ||
-                  (strncmp ("--gtk-debug=", (*argv)[i], 12) == 0))
-           {
-             gchar *equal_pos = strchr ((*argv)[i], '=');
-             
-             if (equal_pos != NULL)
-               {
-                 gtk_debug_flags |= g_parse_debug_string (equal_pos+1,
-                                                          gtk_debug_keys,
-                                                          gtk_ndebug_keys);
-               }
-             else if ((i + 1) < *argc && (*argv)[i + 1])
-               {
-                 gtk_debug_flags |= g_parse_debug_string ((*argv)[i+1],
-                                                          gtk_debug_keys,
-                                                          gtk_ndebug_keys);
-                 (*argv)[i] = NULL;
-                 i += 1;
-               }
-             (*argv)[i] = NULL;
-           }
-         else if ((strcmp ("--gtk-no-debug", (*argv)[i]) == 0) ||
-                  (strncmp ("--gtk-no-debug=", (*argv)[i], 15) == 0))
-           {
-             gchar *equal_pos = strchr ((*argv)[i], '=');
-             
-             if (equal_pos != NULL)
-               {
-                 gtk_debug_flags &= ~g_parse_debug_string (equal_pos+1,
-                                                           gtk_debug_keys,
-                                                           gtk_ndebug_keys);
-               }
-             else if ((i + 1) < *argc && (*argv)[i + 1])
-               {
-                 gtk_debug_flags &= ~g_parse_debug_string ((*argv)[i+1],
-                                                           gtk_debug_keys,
-                                                           gtk_ndebug_keys);
-                 (*argv)[i] = NULL;
-                 i += 1;
-               }
-             (*argv)[i] = NULL;
-           }
-#endif /* G_ENABLE_DEBUG */
-         i += 1;
-       }
-      
-      for (i = 1; i < *argc; i++)
-       {
-         for (k = i; k < *argc; k++)
-           if ((*argv)[k] != NULL)
-             break;
-         
-         if (k > i)
-           {
-             k -= i;
-             for (j = i + k; j < *argc; j++)
-               (*argv)[j-k] = (*argv)[j];
-             *argc -= k;
-           }
-       }
-    }
+static void
+do_post_parse_initialization (int    *argc,
+                             char ***argv)
+{
+  GSList *slist;
 
   if (gtk_debug_flags & GTK_DEBUG_UPDATES)
     gdk_window_set_debug_updates (TRUE);
@@ -552,8 +492,133 @@ gtk_parse_args (int    *argc,
       _gtk_modules_init (argc, argv, gtk_modules_string->str);
       g_string_free (gtk_modules_string, TRUE);
     }
+}
+
+
+typedef struct
+{
+  gboolean open_default_display;
+} OptionGroupInfo;
+
+static gboolean
+pre_parse_hook (GOptionContext *context,
+               GOptionGroup   *group,
+               gpointer        data,
+               GError        **error)
+{
+  do_pre_parse_initialization (NULL, NULL);
+  
+  return TRUE;
+}
+
+static gboolean
+post_parse_hook (GOptionContext *context,
+                GOptionGroup   *group,
+                gpointer       data,
+                GError        **error)
+{
+  OptionGroupInfo *info = data;
+
+  
+  do_post_parse_initialization (NULL, NULL);
+  
+  if (info->open_default_display)
+    return gdk_display_open_default_libgtk_only () != NULL;
   else
-    _gtk_modules_init (argc, argv, "");
+    return TRUE;
+}
+
+
+GOptionGroup *
+gtk_get_option_group (gboolean open_default_display)
+{
+  GOptionGroup *group;
+  OptionGroupInfo *info;
+
+  info = g_new0 (OptionGroupInfo, 1);
+  info->open_default_display = open_default_display;
+  
+  group = g_option_group_new ("gtk", _("GTK+ Options"), _("Show GTK+ Options"), info, g_free);
+  g_option_group_set_parse_hooks (group, pre_parse_hook, post_parse_hook);
+
+  gdk_add_option_entries_libgtk_only (group);
+  g_option_group_add_entries (group, gtk_args);
+  
+  return group;
+}
+
+gboolean
+gtk_init_with_args (int            *argc,
+                   char         ***argv,
+                   char           *parameter_string,  
+                   GOptionEntry   *entries,
+                   char           *translation_domain,
+                   GError        **error)
+{
+  GOptionContext *context;
+  GOptionGroup *gtk_group;
+  gboolean retval;
+  
+  if (gtk_initialized)
+    return TRUE;
+
+  gtk_group = gtk_get_option_group (TRUE);
+  
+  context = g_option_context_new (parameter_string);
+  g_option_context_add_group (context, gtk_group);
+  
+  if (entries)
+    g_option_context_add_main_entries (context, entries, translation_domain);
+
+  retval = g_option_context_parse (context, argc, argv, error);
+
+  g_option_context_free (context);
+
+  return retval;
+}
+
+
+/**
+ * gtk_parse_args:
+ * @argc: a pointer to the number of command line arguments.
+ * @argv: a pointer to the array of command line arguments.
+ * 
+ * Parses command line arguments, and initializes global
+ * attributes of GTK+, but does not actually open a connection
+ * to a display. (See gdk_display_open(), gdk_get_display_arg_name())
+ *
+ * Any arguments used by GTK+ or GDK are removed from the array and
+ * @argc and @argv are updated accordingly.
+ *
+ * You shouldn't call this function explicitely if you are using
+ * gtk_init(), or gtk_init_check().
+ *
+ * Return value: %TRUE if initialization succeeded, otherwise %FALSE.
+ **/
+gboolean
+gtk_parse_args (int    *argc,
+               char ***argv)
+{
+  GOptionContext *option_context;
+  
+  if (gtk_initialized)
+    return TRUE;
+
+  if (!check_setugid ())
+    return FALSE;
+
+  do_pre_parse_initialization (argc, argv);
+
+  option_context = g_option_context_new (NULL);
+  g_option_context_set_ignore_unknown_options (option_context, TRUE);
+  g_option_context_set_help_enabled (option_context, FALSE);
+  
+  g_option_context_add_main_entries (option_context, gtk_args, NULL);
+
+  g_option_context_parse (option_context, argc, argv, NULL);
+  g_option_context_free (option_context);
+
+  do_post_parse_initialization (argc, argv);
   
   return TRUE;
 }
index 03d0bf38b7545ee6395cd1e7f83c48dcbb72fdd2..150c10a0e5d184d96fd0c94de37ff75ea43bc9c6 100644 (file)
@@ -94,6 +94,16 @@ void     gtk_init                 (int    *argc,
 
 gboolean gtk_init_check           (int    *argc,
                                    char ***argv);
+  
+gboolean gtk_init_with_args       (int            *argc,
+                                  char         ***argv,
+                                  char           *parameter_string,
+                                  GOptionEntry   *entries,
+                                  char           *translation_domain,
+                                  GError        **error);
+
+GOptionGroup *gtk_get_option_group (gboolean open_default_display);
+  
 #ifdef G_PLATFORM_WIN32
 
 /* Variants that are used to check for correct struct packing
index 0ef4617d3b2bbd8bda96ae0afb385d7c0ed1f6b8..fd01d70987f7c04a9acc6898a759cdb398f79020 100644 (file)
@@ -234,12 +234,7 @@ main (int argc, char *argv[])
   GtkTreeModel *model;
   GOptionContext *context;
   
-  gtk_init (&argc, &argv);
-
-  context = g_option_context_new ("");
-  g_option_context_add_main_entries (context, entries, "");
-  g_option_context_parse (context, &argc, &argv, NULL);
-  g_option_context_free (context);
+  gtk_init_with_args (&argc, &argv, NULL, entries, NULL, NULL);
 
   model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING));